/**
 * 设计你的循环队列实现。 循环队列是一种线性数据结构，
 * 其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
 */

public class MyCircularQueue {

    private int[] elem;
    private int head;
    private int tail;

    public MyCircularQueue(int k) {
        //这里我使用的方法是 牺牲一个空间来区别空和满
        elem = new int[k + 1];
        head = tail = 0;
    }

    //入队
    public boolean enQueue(int value) {
        //入队时先判断队列是否满
        if(isFull()){
            return false;
        }
        //入队
        elem[tail] = value;
        tail = (tail + 1) % elem.length;
        return true;
    }

    //出队
    public boolean deQueue() {
        //出队时判断队列是否为空
        if(isEmpty()){
            return false;
        }
        head = (head + 1) % elem.length;
        return true;
    }


    //获取队头元素
    public int Front() {
        if (isEmpty()) {
            return -1;
        }
        return elem[head];
    }

    //获取队尾元素
    public int Rear() {
        if (isEmpty()) {
            return -1;
        }
        return elem[(tail + elem.length - 1)%elem.length];
    }

    public boolean isEmpty() {
        return head == tail;
    }

    public boolean isFull() {
        return (tail + 1) % (elem.length) == head;
    }
}
